package util

func None[T any]() Option[T] {
	return &option[T]{}
}
func Some[T any](value T) Option[T] {
	return &option[T]{
		ref: &value,
	}
}

type Option[T any] interface {
	IsEmpty() bool
	Get() T
	GetOrElse(d T) T
	OrElse(other Option[T]) Option[T]
}

type option[T any] struct {
	ref *T
}

func (r *option[T]) IsEmpty() bool { // 是否为空
	return r.ref == nil
}
func (r *option[T]) Get() T { // 获取值
	return *r.ref
}
func (r *option[T]) GetOrElse(d T) T { // 获取值，如果没有则返回默认值
	if r.IsEmpty() {
		return d
	}

	return *r.ref
}
func (r *option[T]) OrElse(other Option[T]) Option[T] { // 获取，如果没有则返回另一个
	if r.IsEmpty() {
		return other
	}

	return r
}
